/********************************************************************************
 * Project Name		[JavaEE_Components]
 * File Name     	[JavaMail03.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package javamail._notes;

/**
 * 邮件的查看, 解析, 搜索
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public final class JavaMail03 {

	public void parseMailSteps() {
		/**
		 * 检查邮件和解析邮件的步骤<br/>
		 * 
		 * 1. 根据Propreties文件创建一个Session<br/>
		 * 2. 创建POP3 Store对象并连接POP服务器<br/>
		 * 3. 创建Folder对象, 在邮箱中打开对应的文件夹<br/>
		 * 4. 得到Message对象<br/>
		 * 5. 解析Message对象<br/>
		 * 6. 关闭Store对象和Folder对象<br/>
		 */
	}

	public void store() {
		/**
		 * javax.mail.Store, 用于执行邮件接收任务, 该类对象封装了某种邮件协议的底层细节<br/>
		 * 
		 * <code>
		 * Store store = session.getStore("pop3");
		 * store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
		 * 
		 * URLName url = new URLName(MailConstants.PROTOCAL_POP3, MailConstants.POP3_HOST_OF_SINA, 
		 *     Integer.parseInt(MailConstants.POP3_PORT_OF_SINA), null, emailAddress, PasswordUtils.readPassword(emailAddress));
		 * store store = session.getStore(url);
		 * store.connect(emailAddress, PasswordUtils.readPassword(emailAddress));
		 * </code><br/>
		 * 
		 * 主要方法<br/>
		 * connect();连接邮件服务器<br/>
		 * connect(String host, String username, String password);<br/>
		 * connect(String host, int port, String username, String password)<br/>
		 * isConnected();检测客户端和邮件服务器是否连接<br/>
		 * getFolder(String folderName); 用于返回指定名称的邮件文件夹<br/>
		 */
	}

	public void folder() {
		/**
		 * javax.mail.Folder, 代表了文件夹抽象类的实例<br/>
		 * 
		 * 获得一个Folder<br/>
		 * 可以从Session获取<br/>
		 * 可以从Store获取<br/>
		 * 可以从其他的Folder获取<br/>
		 * <code>
		 * // 以Store为例, 获得收件箱
		 * Folder folder = store.getFolder("INBOX");
		 * // 以只读权限打开收件箱, 还可以配置为Folder.READ_WRITE
		 * folder.open(Folder.READ_ONLY);
		 * </code>
		 * 
		 * 主要方法<br/>
		 * 
		 * 1. 基本方法<br/>
		 * boolean exists(); 查看Folder是否存在<br/>
		 * open(int Mode); 打开一个Folder, 两种模式: READ_ONLY/READ_WRITE<br/>
		 * boolean isOpen(); 查看一个Folder是否为打开状态<br/>
		 * close(boolean); 关闭一个Folder, true:任何已删除的邮件将彻底从邮件服务器中删除,
		 * false:将邮件标记为已删除的 <br/>
		 * getName(); 返回Folder的名称<br/>
		 * getFullName(); 返回Folder的完整名称[存在子文件夹时使用]<br/>
		 * getURLName(); 返回Folder的URLName表示<br/>
		 * getParent(); 返回当前Folder的父Folder<br/>
		 * getType(); 返回Folder的类型, Folder.HOLDS_MESSAGES/Folder.HOLDS_FOLDERS
		 * <br/>
		 * getMode(); 返回Folder的打开形式, READ_ONLY/READ_WRITE<br/>
		 * getSeparator(); 返回Folder路径的分隔符<br/>
		 * getStore(); 获得指定Folder的Store对象<br/>
		 * 
		 * 2. 管理文件夹<br/>
		 * create(int type); 创建Folder, type:
		 * Folder.HOLDS_MESSAGES/Folder.HOLDS_FOLDERS<br/>
		 * delete(boolean); 在Folder关闭后删除Folder, true: 递归删除子Folder<br/>
		 * renameTo(Folder folder); 在Folder关闭后重命名Folder<br/>
		 * 
		 * 3. 管理邮件<br/>
		 * appendMessages(Message[]); 将数组中的Message对象附在Folder中<br/>
		 * copyMessages(Message[], Folder dest); 将数组中的Messages拷贝到目标Folder中<br/>
		 * expunge(); 此方法用于物理删除邮件<br/>
		 * <code>
		 * message.setFlag(Flags.Flag.DELETED, true); // 把消息标记为已删除
		 * </code><br/>
		 * 
		 * 4. 列出文件夹内容<br/>
		 * list()/listSubscribed(); 返回一个Folder下所有的子Folder<br/>
		 * list(String pattern)/listSubscribed(String pattern);
		 * 以指定模式列出一个Folder下所有的子Folder<br/>
		 * 
		 * 5. 检查邮件<br/>
		 * getMessageCount(); 得到指定Folder下Message的记录数<br/>
		 * getNewMessageCount(); 得到指定Folder下新Message的记录数<br/>
		 * getUnreadMessageCount(); 得到指定Folder下未读Message的记录数<br/
		 * getDeletedMessageCount(); 得到指定Folder下已删除Message的记录数<br/>
		 * hasNewMessages(); 查看指定Folder是否有新Message<br/>
		 * 
		 * 6. 获取Message<br/>
		 * getMessage(int number); 得到指定索引的Message<br/>
		 * getMessages(); 返回指定Folder下所有的Message<br/>
		 * getMessages(int start, int end); 返回指定索引范围的Message<br/>
		 * getMessages(int[] numbers); 返回指定索引的Message<br/>
		 * fetch(Message[], FetchProfile fp); 返回指定headers的所有消息<br/>
		 * 
		 * 7. 搜索Message<br/>
		 * search(SearchTerm term>; 搜索指定条件的Message<br/>
		 * search(SearchTerm term, Message[] messages);
		 * 根据搜索条件查找指定messages里面所有符合条件的Message<br/>
		 * 
		 * 8. 更新Message[改变指定的Folder的消息集合的标志]<br/>
		 * setFlags(Message[], Flags flag, boolean value);<br/>
		 * setFlags(int start, int end, Flags flag, boolean value);<br/>
		 * setFlags(int[] numbers, Flags flag, boolean value);<br/>
		 * getPermanentFlags();<br/>
		 * 
		 */
	}

	public void flag() {
		/**
		 * javax.mail.Flags.Flag 该类内部预定义了各种不同的邮件标记<br/>
		 * 
		 * Flags.Flag.ANSWERED, 标识邮件是否已回复<br/>
		 * Flags.Flag.DELETED, 标识邮件是否需要删除<br/>
		 * Flags.Flag.DRAFT, 标识邮件是否为草稿<br/>
		 * Flags.Flag.FLAGGED, 标识邮件是否为回收站中的邮件<br/>
		 * Flags.Flag.RECENT, 标识邮件是否为新邮件<br/>
		 * Flags.Flag.SEEN, 标识邮件是否已被阅读<br/>
		 * Flags.Flag.USER, 标识邮件是否支持用户自定义标记, 此属性为只读<br/>
		 * 
		 * 构造方法<br/>
		 * new Flag();<br/>
		 * new Flag(Flags flags);<br/>
		 * new Flags(Flags.Flag flag);常用<br/>
		 * new Flags(String flag);<br/>
		 * 
		 * 主要方法<br/>
		 * getSystemFlags(); 返回当前Flag对象中所有的系统标记<br/>
		 * getUserFlags(); 返回当前Flag对象中所有的用户标记<br/>
		 * 
		 * <code>
		 * // 设置邮件标识
		 * message.setFlag(Flags.Flag.DELETED, true);
		 * </code>
		 */
	}

	public void differencesBetweenPop3AndImap() {
		/**
		 * POP3协议和IMAP协议的区别<br/>
		 * 
		 * POP3协议允许电子邮件客户端下载服务器上的邮件, 但是在客户端的操作[如移动邮件, 标记已读等), 不会反馈到服务器上<br/>
		 * IMAP协议提供WebMail与电子邮件客户端之间的双向通信, 客户端的操作都会同步反应到服务器上, 对邮件进行的操作, 服务器
		 * 上的邮件也会做相应的动作, 比如在客户端收取了邮箱中的3封邮件, 并将其中一封标记为已读, 将另外两封标记为删除, 这些操作会
		 * 即时反馈到服务器上<br/>
		 * 两种协议相比, IMAP协议更为便捷和可靠, POP3容易丢失邮件或多次下载相同的邮件, 但IMAP协议通过邮件客户端
		 * 与WebMail之间的双向同步功能很好地避免了这些问题<br/>
		 */
	}

	public void searchItem() {
		/**
		 * javax.mail.search.SearchTerm, 用于实现邮件搜索的API<br/>
		 * 
		 * 逻辑组合关系类<br/>
		 * javax.mail.search.AndTerm AND条件<br/>
		 * javax.mail.search.OrTerm OR条件<br/>
		 * javax.mail.search.NotTerm NOT条件<br/>
		 * javax.mail.search.ComparisonTerm 比较条件<br/>
		 * 
		 * 其他条件搜索类<br/>
		 * javax.mail.search.SentDateTerm<br/>
		 * javax.mail.search.ReceivedDateTerm<br/>
		 * javax.mail.search.BodyTerm<br/>
		 * javax.mail.search.FromStringTerm<br/>
		 * javax.mail.search.RecipientStringTerm<br/>
		 * javax.mail.search.SubjectTerm<br/>
		 */
	}
}
